home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 081-090 / amok82 / plot / source / plot.mod < prev    next >
Text File  |  1993-11-04  |  49KB  |  1,355 lines

  1. (***********************************************************************
  2.  
  3.    :Program.    Plot
  4.    :Author.     Stefan Köhle
  5.    :Address.    Erhardtstr. 10
  6.                 W-7033 Herrenberg
  7.    :Phone.      07032/5146
  8.    :shortcut.
  9.    :Version.    1.0
  10.    :Date.       31.12.92
  11.    :Copyright.  nix
  12.    :Language.   Modula-II.
  13.    :Translator. M2Amiga 4.107d
  14.    :Imports.    Formelauswertung,
  15.                 FormelausFText   by Stefan Salewski    (AMOK 11)
  16.                 Req.Library      by Jürgen Zimmermann  (AMOK 55)
  17.                 ReqSupport       by Jürgen Zimmermann  (AMOK 55)
  18.                 ReqTools.Library by Nico Francois      (AMOK 69)
  19.                 ReqTools.def     by Kai Bolay          (AMOK 69)
  20.                 ReqToolsSupport  by Frank Lömker       (AMOK 69)
  21.                 IFFLib           by Christian A. Weber (AMOK 18)
  22.                 IFFLib.def       by Fridtjof Siebert   (AMOK 18)
  23.                 PlotInit,PlotZeichnen,
  24.                 PlotZeichnen2,MyMathLib by myself
  25.  
  26.    :UpDate.     -
  27.    :Contents.
  28.    :Remark.
  29.  
  30. **********************************************************************)
  31. MODULE Plot ;
  32.  
  33.  
  34. FROM Formelauswertung IMPORT FFPBerechnung,varListFFP,DefFormel,Formelnummer,
  35.                              AssignFFP;
  36. FROM FormelausFText   IMPORT GetFehlertext ;
  37. FROM ReqSupport       IMPORT GetPathFromLock ;
  38.  
  39. FROM PlotInit         IMPORT PlotBasePtr,PlotBase,UpdateMenus,
  40.                              Laden,Speichern,WelcheTaste,MenuNummer,ItemNummer,
  41.                              CleanUp,SetUp,ScreenHoch,ScreenWeg,
  42.                              ArgTesten,FunktionHolen,
  43.                              UpdatePb,BildSpeichern,BildLaden,
  44.                              Request,YesNoRequest ;
  45. FROM PlotZeichnen     IMPORT RasterZeichnen,RestRaster,BeschriftungZeichnen,
  46.                              ClearBitMap,FunktionReinSchreiben,HelpFenster ;
  47. FROM PlotZeichnen2    IMPORT KastenZeichnen,XAchseZeichnen,
  48.                              YAchseZeichnen,RestYAchseZeichnen,
  49.                              ZAchseZeichnen,RestXAchseZeichnen ;
  50. FROM MyMathLib        IMPORT IntToReal,RealToInt,IntToFFP,FFPToInt ;
  51.  
  52.  
  53. IMPORT Arts,DosL ;
  54. IMPORT IntuitionL ;
  55. IMPORT InOut ;
  56. FROM DosD       IMPORT FileLockPtr;
  57. FROM WorkbenchD IMPORT WBStartupPtr;
  58. FROM Arguments  IMPORT NumArgs,GetArg ;
  59. FROM SYSTEM     IMPORT ADDRESS,ADR,FFP,LONGSET ;
  60. FROM IntuitionL IMPORT ScreenToFront,SetMenuStrip,ClearMenuStrip;
  61. FROM IntuitionD IMPORT IDCMPFlagSet,menuPick,IntuiMessage,IntuitionBasePtr,
  62.                        MenuItem,MenuItemFlags,MenuItemFlagSet,Menu,rawKey,
  63.                        IntuiText,WindowPtr ;
  64. FROM GraphicsL  IMPORT Move,Draw,SetAPen,SetDrMd,SetRGB4,AreaMove,
  65.                        AreaDraw,AreaEnd,SetBPen,RectFill,Text ;
  66. FROM GraphicsD  IMPORT jam1,GfxBasePtr;
  67. FROM String     IMPORT Length,Compare,Copy ;
  68. FROM GfxMacros  IMPORT SetDrPt,SetOPen ;
  69.  
  70. FROM ExecL      IMPORT GetMsg,ReplyMsg,WaitPort,AllocMem,FreeMem ;
  71. FROM ExecD      IMPORT MemReqSet,MemReqs ;
  72. FROM LayersL    IMPORT ScrollLayer ;
  73. FROM UtilityD   IMPORT tagEnd,TagPtr ;
  74.  
  75.  
  76.  
  77. CONST BitMapWidth = 1720 ;
  78.       BitMapHeight = 1351 ;
  79.  
  80. TYPE
  81.  
  82.      Menus    = (Menu1,Menu2,Menu3) ;
  83.      Items    = (Item1,Item2,Item3,Item4,Item5,Item6,Item7,Item8) ;
  84.      ItemTyp  = ARRAY [Menu1..Menu3],[Item1..Item8] OF MenuItem ;
  85.      String   = ARRAY[0..20] OF CHAR ;
  86.  
  87.      Variablen = RECORD
  88.                     IntuiBase   : IntuitionBasePtr ;
  89.                     PadFaktorX  : FFP ;
  90.                     PadFaktorY  : FFP ;
  91.                     PadHeight   : INTEGER ;
  92.                     PadWidth    : INTEGER ;
  93.                     Ende        : BOOLEAN ;
  94.                     OK          : BOOLEAN ;
  95.                     Ausstieg    : BOOLEAN ;
  96.                     NeuBerechnen: BOOLEAN ;
  97.                     Argument    : BOOLEAN ;
  98.                     len         : INTEGER ;
  99.                     error       : INTEGER ;
  100.                     fN          : CARDINAL ;
  101.                     MaxErgebnis : FFP ;
  102.                     XNormiert   : FFP ;
  103.                     YNormiert   : FFP ;
  104.                     FaktorX     : FFP ;
  105.                     FaktorY     : FFP ;
  106.                     FaktorZ     : FFP ;
  107.                     YWertmax    : INTEGER ;
  108.                     YWertmin    : INTEGER ;
  109.                     msg         : WBStartupPtr;
  110.                     lock        : FileLockPtr;
  111.                     Item        : ItemTyp ;
  112.                     MenuStrip   : ARRAY [Menu1..Menu3] OF Menu ;
  113.                     ItemTexts   : ARRAY [Menu1..Menu3],[Item1..Item8] OF
  114.                                                                   IntuiText ;
  115.  
  116.                  END (* RECORD *) ;
  117.  
  118.  
  119. VAR
  120.      Pb        : PlotBasePtr ;               (* alle globalen Variablen *)
  121.      V         : POINTER TO Variablen ;      (* alle lokalen Variablen *)
  122.  
  123.      k         : REAL ;
  124.      x,y       : INTEGER ;
  125.      i,j       : INTEGER ;
  126.      F         : FFP ;
  127.  
  128.  
  129. PROCEDURE InitMenu(VAR Pb: PlotBasePtr) ;   (*********************************)
  130.  
  131. VAR
  132.  
  133.      SubItem      : MenuItem ;
  134.      SubItemText  : IntuiText ;
  135.      m            : Menus ;
  136.      t            : Items ;
  137.  
  138. BEGIN
  139.  
  140.    WITH V^.MenuStrip[Menu1] DO
  141.       nextMenu := ADR(V^.MenuStrip[Menu2])  ;
  142.       leftEdge := 10 ; width := 70 ;
  143.       topEdge := 0 ; height := 0 ;
  144.       flags := {0} ;
  145.       menuName := ADR('Projekt') ;
  146.       firstItem := ADR(V^.Item[Menu1,Item1]) ;
  147.    END (* WITH *) ;
  148.  
  149.    V^.MenuStrip[Menu2] := V^.MenuStrip[Menu1] ;
  150.  
  151.    WITH V^.MenuStrip[Menu2] DO
  152.       nextMenu  := ADR(V^.MenuStrip[Menu3]) ;
  153.       leftEdge := 90 ; width := 100 ;
  154.       menuName  := ADR('Auflösung') ;
  155.       firstItem := ADR(V^.Item[Menu2,Item1]) ;
  156.    END (* WITH *) ;
  157.  
  158.    V^.MenuStrip[Menu3] := V^.MenuStrip[Menu1] ;
  159.    WITH V^.MenuStrip[Menu3] DO
  160.       nextMenu  := NIL ;
  161.       leftEdge := 190 ; width := 120 ;
  162.       menuName  := ADR('Einstellungen') ;
  163.       firstItem := ADR(V^.Item[Menu3,Item1]) ;
  164.    END (* WITH *) ;
  165.  
  166.  
  167.    WITH V^.Item[Menu1,Item1] DO                      (* allgemein *)
  168.       nextItem := ADR(V^.Item[Menu1,Item2]) ;
  169.       leftEdge := -5 ; topEdge := 0 ;
  170.       height := 20 ;    (* 150 *)
  171.       flags := MenuItemFlagSet{checkIt,highComp,itemText,itemEnabled} ;
  172.       mutualExclude := LONGSET{} ;
  173.       itemFill := ADR(V^.ItemTexts[Menu1,Item1]);
  174.       selectFill := NIL ;
  175.       subItem := NIL ;
  176.    END (* WITH *) ;
  177.  
  178.    WITH V^.ItemTexts[Menu1,Item1] DO
  179.       frontPen := 0; backPen := 1 ; drawMode := jam1 ;
  180.       leftEdge := 2; topEdge := 5 ; iTextFont:= NIL ;
  181.       nextText := NIL ;
  182.    END (* WITH *) ;
  183.  
  184.    V^.Item[Menu1,Item1].width := 25*8 ;
  185.    FOR t := Item1 TO Item8 DO
  186.       V^.Item[Menu3,t] := V^.Item[Menu1,Item1] ;
  187.       V^.ItemTexts[Menu3,t] := V^.ItemTexts[Menu1,Item1] ;
  188.    END (* FOR *) ;
  189.  
  190.    V^.Item[Menu1,Item1].width := 15*8 ;
  191.    FOR t := Item1 TO Item8 DO
  192.       V^.Item[Menu2,t] := V^.Item[Menu1,Item1] ;
  193.       V^.ItemTexts[Menu2,t] := V^.ItemTexts[Menu1,Item1] ;
  194.    END (* FOR *) ;
  195.  
  196.    V^.Item[Menu1,Item1].width := 19*8 ;
  197.    FOR t := Item1 TO Item8 DO
  198.       V^.Item[Menu1,t] := V^.Item[Menu1,Item1] ;
  199.       V^.ItemTexts[Menu1,t] := V^.ItemTexts[Menu1,Item1] ;
  200.    END (* FOR *) ;
  201.  
  202.  
  203.    EXCL(V^.Item[Menu1,Item1].flags,checkIt) ;
  204.  
  205.    V^.Item[Menu1,Item2].nextItem := ADR(V^.Item[Menu1,Item3]) ; (* Funktion ändern *)
  206.    V^.Item[Menu1,Item2].topEdge := 21 ;
  207.    EXCL(V^.Item[Menu1,Item2].flags,checkIt) ;
  208.    V^.Item[Menu1,Item2].itemFill := ADR(V^.ItemTexts[Menu1,Item2]) ;
  209.  
  210.    V^.Item[Menu1,Item3].nextItem := ADR(V^.Item[Menu1,Item4]) ;(* Funktion laden*)
  211.    V^.Item[Menu1,Item3].topEdge := 43 ;
  212.    EXCL(V^.Item[Menu1,Item3].flags,checkIt) ;
  213.    V^.Item[Menu1,Item3].itemFill := ADR(V^.ItemTexts[Menu1,Item3]) ;
  214.  
  215.    V^.Item[Menu1,Item4].nextItem := ADR(V^.Item[Menu1,Item5]) ;(*Funktion speichern *)
  216.    V^.Item[Menu1,Item4].topEdge := 65 ;
  217.    EXCL(V^.Item[Menu1,Item4].flags,checkIt) ;
  218.    V^.Item[Menu1,Item4].itemFill := ADR(V^.ItemTexts[Menu1,Item4]) ;
  219.  
  220.    V^.Item[Menu1,Item5].nextItem := ADR(V^.Item[Menu1,Item6]) ;(* Bild speichern *)
  221.    V^.Item[Menu1,Item5].topEdge := 87 ;
  222.    EXCL(V^.Item[Menu1,Item5].flags,checkIt) ;
  223.    V^.Item[Menu1,Item5].itemFill := ADR(V^.ItemTexts[Menu1,Item5]) ;
  224.  
  225.    V^.Item[Menu1,Item6].nextItem := ADR(V^.Item[Menu1,Item7]) ;(* Bild laden *)
  226.    V^.Item[Menu1,Item6].topEdge := 109 ;
  227.    EXCL(V^.Item[Menu1,Item6].flags,checkIt) ;
  228.    EXCL(V^.Item[Menu1,Item6].flags,itemEnabled) ;
  229.    V^.Item[Menu1,Item6].itemFill := ADR(V^.ItemTexts[Menu1,Item6]) ;
  230.  
  231.    V^.Item[Menu1,Item7].nextItem := NIL ;                    (* Quit *)
  232.    V^.Item[Menu1,Item7].topEdge := 131 ;
  233.    EXCL(V^.Item[Menu1,Item7].flags,checkIt) ;
  234.    V^.Item[Menu1,Item7].itemFill := ADR(V^.ItemTexts[Menu1,Item7]) ;
  235.  
  236.  
  237.    V^.Item[Menu2,Item1].nextItem := ADR(V^.Item[Menu2,Item2]) ;    (* lächerlich *)
  238.    V^.Item[Menu2,Item1].flags :=
  239.                MenuItemFlagSet{checkIt,checked,highComp,itemText,itemEnabled} ;
  240.    V^.Item[Menu2,Item1].itemFill := ADR(V^.ItemTexts[Menu2,Item1]) ;
  241.  
  242.    V^.Item[Menu2,Item2].nextItem := ADR(V^.Item[Menu2,Item3]) ;   (* gering *)
  243.    V^.Item[Menu2,Item2].topEdge := 21 ;
  244.    V^.Item[Menu2,Item2].flags :=
  245.                     MenuItemFlagSet{checkIt,highComp,itemText,itemEnabled} ;
  246.    V^.Item[Menu2,Item2].itemFill := ADR(V^.ItemTexts[Menu2,Item2]) ;
  247.  
  248.    V^.Item[Menu2,Item3].nextItem := ADR(V^.Item[Menu2,Item4]) ;   (* mittel *)
  249.    V^.Item[Menu2,Item3].topEdge := 43 ;
  250.    V^.Item[Menu2,Item3].flags :=
  251.                     MenuItemFlagSet{checkIt,highComp,itemText,itemEnabled} ;
  252.    V^.Item[Menu2,Item3].itemFill := ADR(V^.ItemTexts[Menu2,Item3]) ;
  253.  
  254.    V^.Item[Menu2,Item4].nextItem := ADR(V^.Item[Menu2,Item5]) ;   (* hoch *)
  255.    V^.Item[Menu2,Item4].topEdge := 65 ;
  256.    V^.Item[Menu2,Item4].flags :=
  257.                     MenuItemFlagSet{checkIt,highComp,itemText,itemEnabled} ;
  258.    V^.Item[Menu2,Item4].itemFill := ADR(V^.ItemTexts[Menu2,Item4]) ;
  259.  
  260.    V^.Item[Menu2,Item5].nextItem := NIL ;                      (* noch höher *)
  261.    V^.Item[Menu2,Item5].topEdge := 87 ;
  262.    V^.Item[Menu2,Item5].itemFill := ADR(V^.ItemTexts[Menu2,Item5]) ;
  263.  
  264.  
  265.    V^.Item[Menu3,Item1].nextItem := ADR(V^.Item[Menu3,Item2]) ;      (* Raster *)
  266.    V^.Item[Menu3,Item1].itemFill := ADR(V^.ItemTexts[Menu3,Item1]) ;
  267.  
  268.    V^.Item[Menu3,Item2].nextItem := ADR(V^.Item[Menu3,Item3]) ;    (* Kasten *)
  269.    V^.Item[Menu3,Item2].topEdge := 21 ;
  270.    V^.Item[Menu3,Item2].itemFill := ADR(V^.ItemTexts[Menu3,Item2]) ;
  271.  
  272.    V^.Item[Menu3,Item3].nextItem := ADR(V^.Item[Menu3,Item4]) ;    (* Achsen *)
  273.    V^.Item[Menu3,Item3].topEdge := 43 ;
  274.    V^.Item[Menu3,Item3].itemFill := ADR(V^.ItemTexts[Menu3,Item3]) ;
  275.  
  276.    V^.Item[Menu3,Item4].nextItem := ADR(V^.Item[Menu3,Item5]) ;    (* Beschriftung *)
  277.    V^.Item[Menu3,Item4].topEdge := 65 ;
  278.    V^.Item[Menu3,Item4].itemFill := ADR(V^.ItemTexts[Menu3,Item4]) ;
  279.  
  280.    V^.Item[Menu3,Item5].nextItem := ADR(V^.Item[Menu3,Item6]) ;    (* Flaeche *)
  281.    V^.Item[Menu3,Item5].topEdge := 87 ;
  282.    V^.Item[Menu3,Item5].itemFill := ADR(V^.ItemTexts[Menu3,Item5]) ;
  283.  
  284.    V^.Item[Menu3,Item6].nextItem := ADR(V^.Item[Menu3,Item7]) ;    (* f(x,y)  *)
  285.    V^.Item[Menu3,Item6].topEdge := 109 ;
  286.    V^.Item[Menu3,Item6].itemFill := ADR(V^.ItemTexts[Menu3,Item6]) ;
  287.  
  288.    V^.Item[Menu3,Item7].nextItem := ADR(V^.Item[Menu3,Item8]) ;    (* kl Bitmap *)
  289.    V^.Item[Menu3,Item7].topEdge := 141 ;
  290.    V^.Item[Menu3,Item7].itemFill := ADR(V^.ItemTexts[Menu3,Item7]) ;
  291.  
  292.    V^.Item[Menu3,Item8].nextItem := NIL ;                     (* gr Bitmap *)
  293.    V^.Item[Menu3,Item8].topEdge := 163 ;
  294.    IF NOT Pb^.GrosserSpeicher THEN
  295.       EXCL(V^.Item[Menu3,Item8].flags,itemEnabled) ;
  296.    END (* IF *) ;
  297.    V^.Item[Menu3,Item8].itemFill := ADR(V^.ItemTexts[Menu3,Item8]) ;
  298.  
  299.  
  300.    V^.ItemTexts[Menu1,Item1].iText := ADR('neue Funktion') ;
  301.    V^.ItemTexts[Menu1,Item2].iText := ADR('Funktion ändern') ;
  302.    V^.ItemTexts[Menu1,Item3].iText := ADR('Funktion laden') ;
  303.    V^.ItemTexts[Menu1,Item4].iText := ADR('Funktion speichern') ;
  304.    V^.ItemTexts[Menu1,Item5].iText := ADR('Bild speichern') ;
  305.    V^.ItemTexts[Menu1,Item6].iText := ADR('Bild laden') ;
  306.    V^.ItemTexts[Menu1,Item7].iText := ADR('Quit') ;
  307.  
  308.    V^.ItemTexts[Menu2,Item1].iText := ADR('    lächerlich') ;
  309.    V^.ItemTexts[Menu2,Item2].iText := ADR('    gering') ;
  310.    V^.ItemTexts[Menu2,Item3].iText := ADR('    mittel') ;
  311.    V^.ItemTexts[Menu2,Item4].iText := ADR('    hoch') ;
  312.    V^.ItemTexts[Menu2,Item5].iText := ADR('    noch höher') ;
  313.  
  314.    V^.ItemTexts[Menu3,Item1].iText := ADR('    Raster') ;
  315.    V^.ItemTexts[Menu3,Item2].iText := ADR('    Kasten') ;
  316.    V^.ItemTexts[Menu3,Item3].iText := ADR('    Achsen') ;
  317.    V^.ItemTexts[Menu3,Item4].iText := ADR('    Beschriftung') ;
  318.    V^.ItemTexts[Menu3,Item5].iText := ADR('    Fläche') ;
  319.    V^.ItemTexts[Menu3,Item6].iText := ADR('    f(x,y) reinschreiben') ;
  320.    V^.ItemTexts[Menu3,Item7].iText := ADR('    kleine Bitmap') ;
  321.    V^.ItemTexts[Menu3,Item8].iText := ADR('    grosse Bitmap') ;
  322.  
  323.    V^.OK := SetMenuStrip(Pb^.Screen^.firstWindow,ADR(V^.MenuStrip[Menu1])) ;
  324.    IF NOT(V^.OK) THEN
  325.       Request('Menus gehn nicht','Na dann nicht',NIL) ;
  326.       Arts.Terminate ;
  327.    END ;
  328.  
  329. END InitMenu ;
  330.  
  331.  
  332. (*-----------------------------------------------------------------------
  333.  
  334.   Hier wird versucht die Procedur SetUp aus PlotInit aufzurufen.
  335.   Falls der Speicher nicht für die große Bitmap langt, wird die
  336.   Sparversion versucht.
  337.  
  338.   -----------------------------------------------------------------------*)
  339.  
  340.  
  341. PROCEDURE StartUp ; (*******************************************************)
  342.  
  343.   VAR Feler: CARDINAL ;
  344.  
  345.   BEGIN
  346.  
  347.    Feler := SetUp(Pb) ;
  348.  
  349.    IF Feler # 0 THEN
  350.  
  351.       CASE Feler OF
  352.  
  353.          3,4: IF NOT YesNoRequest(
  354.                      'Der Chipmem langt nur\nfür eine kleine BitMap',
  355.                      'Abbruch|Also gut',NIL)  THEN
  356.  
  357.                  Arts.Terminate ;         (* Abbruch *)
  358.               END (* IF *) ;
  359.  
  360.       ELSE
  361.          IF NOT YesNoRequest('Der Speicher langt nur\nfür eine kleine BitMap',
  362.                              'Abbruch|Also gut',NIL)  THEN
  363.  
  364.             Arts.Terminate ;         (* Abbruch *)
  365.          END (* IF *) ;
  366.       END (* CASE *) ;
  367.  
  368.       Pb^.GrosserSpeicher := FALSE ;
  369.       Pb^.GrosseBitmap := FALSE ;
  370.  
  371.       Feler := SetUp(Pb) ;
  372.  
  373.       IF  Feler # 0 THEN
  374.  
  375.          CleanUp(Pb) ;
  376.  
  377.          CASE Feler OF
  378.             2: Request("Kein Speicher für BitmapPtr","Mist",NIL) ; |
  379.             3: Request("Kein Speicher für Bitplane","Mist",NIL) ; |
  380.             4: Request("Kein Speicher für TempRas","Mist",NIL) ; |
  381.             5: Request("Screen geht nicht auf","Mist",NIL) ; |
  382.             6: Request("Window geht nicht auf","Mist",NIL) ; |
  383.             7: Request("Kein Speicher für Variablen","Mist",NIL) ;
  384.          ELSE
  385.             Request("Unbekannter Fehler ???","Kaum zu glauben",NIL) ;
  386.  
  387.          END  (* CASE *);
  388.  
  389.          Arts.Terminate ;
  390.       END (* IF *) ;
  391.    END ;
  392.  
  393.    InitMenu(Pb) ;
  394. END StartUp ;
  395.  
  396.  
  397.  
  398.  
  399.  
  400. PROCEDURE f(x: FFP; y: FFP ): FFP ;  (***********************************)
  401.  
  402.   VAR Ergebnis: FFP ;
  403.  
  404.   BEGIN
  405.    varListFFP['x']:= x ;
  406.    varListFFP['y']:= y ;
  407.    FFPBerechnung(2,Ergebnis,V^.fN) ;
  408.  
  409.    IF Ergebnis > V^.MaxErgebnis THEN
  410.       Ergebnis := V^.MaxErgebnis ;
  411.    ELSIF Ergebnis < -V^.MaxErgebnis THEN
  412.       Ergebnis := -V^.MaxErgebnis ;
  413.    END ;
  414.  
  415.    RETURN Ergebnis ;
  416.  
  417. END f ;
  418.  
  419.  
  420. PROCEDURE CheckMessage ; (***************************************************)
  421.  
  422.   VAR
  423.      mousex,mousey,
  424.      XScroll,YScroll : INTEGER ;
  425.      IntuiMsg     : POINTER TO IntuiMessage;
  426.      class        : IDCMPFlagSet ;
  427.      code         : CARDINAL ;
  428.      Taste        : CARDINAL ;
  429.  
  430.      Rest      : FFP ;
  431.      Rest2,Rest3     : FFP ;
  432.  
  433.   BEGIN
  434.    IntuiMsg := GetMsg(Pb^.Screen^.firstWindow^.userPort) ;
  435.    WHILE IntuiMsg # NIL DO
  436.       class := IntuiMsg^.class ;
  437.       code := IntuiMsg^.code ;
  438.       ReplyMsg(IntuiMsg) ;
  439.  
  440.       IF NOT Pb^.GrosseBitmap THEN
  441.          IF (rawKey IN class) THEN
  442.             Taste := WelcheTaste(code);
  443.             IF NOT (Taste = 0) THEN
  444.                CASE Taste OF
  445.                   280,278  :  V^.Ende := TRUE ; |         (* ESC,Ctrl C *)
  446.  
  447.                   281      :                           (* Help *)
  448.                               IF HelpFenster(Pb) THEN END ;
  449.                               |
  450.  
  451.                   260      :                           (* Cursor rauf *)
  452.  
  453.                               Pb^.B.YHinten := Pb^.B.YHinten+0.5*Pb^.B.DeltaY ;
  454.                               V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
  455.  
  456.                   261      :                           (* Shift  rauf *)
  457.  
  458.                               Pb^.B.YHinten := Pb^.B.YHinten+Pb^.B.DeltaY ;
  459.                               V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
  460.  
  461.                   262      :                           (* Alt rauf *)
  462.  
  463.                               Pb^.B.YHinten := Pb^.B.YHinten+3.0*Pb^.B.DeltaY ;
  464.                               V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
  465.  
  466.                   265      :                           (* Cursor runter *)
  467.  
  468.                               Pb^.B.YHinten := Pb^.B.YHinten-0.5*Pb^.B.DeltaY ;
  469.                               V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
  470.  
  471.                   266      :                           (* Shift  runter *)
  472.  
  473.                               Pb^.B.YHinten := Pb^.B.YHinten-Pb^.B.DeltaY ;
  474.                               V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
  475.  
  476.                   267      :                           (* Alt runter *)
  477.  
  478.                               Pb^.B.YHinten := Pb^.B.YHinten-3.0*Pb^.B.DeltaY ;
  479.                               V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
  480.  
  481.                   270,314  :                           (* Cursor links,4 *)
  482.  
  483.                               Pb^.B.XLinks := Pb^.B.XLinks+0.5*Pb^.B.DeltaX ;
  484.                               V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
  485.  
  486.                   271,324  :                           (* Shift links,4*)
  487.  
  488.                               Pb^.B.XLinks := Pb^.B.XLinks+Pb^.B.DeltaX ;
  489.                               V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
  490.  
  491.                   272,334  :                           (* Alt links,4  *)
  492.  
  493.                               Pb^.B.XLinks := Pb^.B.XLinks+4.0*Pb^.B.DeltaX ;
  494.                               V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
  495.  
  496.                   275,316  :                           (* Cursor rechts,6 *)
  497.  
  498.                               Pb^.B.XLinks := Pb^.B.XLinks-0.5*Pb^.B.DeltaX ;
  499.                               V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
  500.  
  501.                   276,326  :                           (* Shift rechts,6 *)
  502.  
  503.                               Pb^.B.XLinks := Pb^.B.XLinks-Pb^.B.DeltaX ;
  504.                               V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
  505.  
  506.                   277,336  :                           (* Alt rechts,6 *)
  507.  
  508.                               Pb^.B.XLinks := Pb^.B.XLinks-4.0*Pb^.B.DeltaX ;
  509.                               V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
  510.  
  511.                   318      :                           (* 8 *)
  512.  
  513.                               Pb^.B.ZOben := Pb^.B.ZOben-0.5*Pb^.B.DeltaZ ;
  514.                               V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
  515.  
  516.                   328      :                           (* SHIFT 8 *)
  517.  
  518.                               Pb^.B.ZOben := Pb^.B.ZOben-Pb^.B.DeltaZ ;
  519.                               V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
  520.  
  521.                   338      :                           (* ALT 8 *)
  522.  
  523.                               Pb^.B.ZOben := Pb^.B.ZOben-4.0*Pb^.B.DeltaZ ;
  524.                               V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
  525.  
  526.                   312      :                           (* 2 *)
  527.  
  528.                               Pb^.B.ZOben := Pb^.B.ZOben+0.5*Pb^.B.DeltaZ ;
  529.                               V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
  530.  
  531.                   322      :                           (* SHIFT 2 *)
  532.  
  533.                               Pb^.B.ZOben := Pb^.B.ZOben+Pb^.B.DeltaZ ;
  534.                               V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
  535.  
  536.                   332      :                           (* ALT 2 *)
  537.  
  538.                               Pb^.B.ZOben := Pb^.B.ZOben+4.0*Pb^.B.DeltaZ ;
  539.                               V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
  540.  
  541.                   291,301  :                (* F1,1 : Zoom in *)
  542.  
  543.                               Pb^.B.XLinks := Pb^.B.XLinks+Pb^.B.DeltaX ;
  544.                               Pb^.B.DeltaX := Pb^.B.DeltaX * 0.5 ;
  545.  
  546.                               Pb^.B.YHinten:= Pb^.B.YHinten +0.75*Pb^.B.DeltaY ;
  547.                               Pb^.B.DeltaY := Pb^.B.DeltaY * 0.5 ;
  548.  
  549.                               Pb^.B.ZOben  := Pb^.B.ZOben -Pb^.B.DeltaZ ;
  550.                               Pb^.B.DeltaZ := Pb^.B.DeltaZ * 0.5 ;
  551.  
  552.                               V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
  553.  
  554.                   292,302  :                         (* F2,2 Zoom in X *)
  555.  
  556.                               Pb^.B.XLinks := Pb^.B.XLinks+Pb^.B.DeltaX ;
  557.                               Pb^.B.DeltaX := Pb^.B.DeltaX * 0.5 ;
  558.                               V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
  559.  
  560.                   293,303  :                         (* F3,3 Zoom in Y *)
  561.                               Pb^.B.YHinten:= Pb^.B.YHinten +0.75*Pb^.B.DeltaY ;
  562.                               Pb^.B.DeltaY := Pb^.B.DeltaY * 0.5 ;
  563.                               V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
  564.  
  565.                   294,304  :                         (* F4,4 Zoom in Z *)
  566.                               Pb^.B.ZOben  := Pb^.B.ZOben -Pb^.B.DeltaZ ;
  567.                               Pb^.B.DeltaZ := Pb^.B.DeltaZ * 0.5 ;
  568.                               V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
  569.  
  570.                   295,305  :                      |  (* F5,5  Nix *)
  571.  
  572.                   296,306  :                         (* F6,6 : Zoom out *)
  573.                               Pb^.B.DeltaX := Pb^.B.DeltaX * 2.0 ;
  574.                               Pb^.B.XLinks := Pb^.B.XLinks-Pb^.B.DeltaX ;
  575.                               Rest := 2.0*Pb^.B.XLinks/Pb^.B.DeltaX ;
  576.                               Rest2 := Rest-IntToFFP(TRUNC(Rest))  ;
  577.                               Rest3 := 0.5*Pb^.B.DeltaX*Rest2 ;
  578.                               Pb^.B.XLinks := Pb^.B.XLinks - Rest3 ;
  579.  
  580.                               Pb^.B.DeltaY := Pb^.B.DeltaY * 2.0 ;
  581.                               Pb^.B.YHinten := Pb^.B.YHinten-0.75*Pb^.B.DeltaY ;
  582.                               Rest := 2.0*Pb^.B.YHinten/Pb^.B.DeltaY ;
  583.                               Rest2 := Rest-IntToFFP(TRUNC(Rest))  ;
  584.                               Rest3 := 0.5*Pb^.B.DeltaY*Rest2 ;
  585.                               Pb^.B.YHinten := Pb^.B.YHinten - Rest3 ;
  586.  
  587.                               Pb^.B.DeltaZ := Pb^.B.DeltaZ * 2.0 ;
  588.                               Pb^.B.ZOben := Pb^.B.ZOben+Pb^.B.DeltaZ ;
  589.                               Rest := 2.0*Pb^.B.ZOben/Pb^.B.DeltaZ ;
  590.                               Rest2 := Rest-IntToFFP(TRUNC(Rest))  ;
  591.                               Rest3 := 0.5*Pb^.B.DeltaZ*Rest2 ;
  592.                               Pb^.B.ZOben := Pb^.B.ZOben - Rest3 ;
  593.  
  594.                               V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
  595.  
  596.                   297,307  :                         (* F7,7 Zoom out X *)
  597.                               Pb^.B.DeltaX := Pb^.B.DeltaX * 2.0 ;
  598.                               Pb^.B.XLinks := Pb^.B.XLinks-Pb^.B.DeltaX ;
  599.                               Rest := 2.0*Pb^.B.XLinks/Pb^.B.DeltaX ;
  600.                               Rest2 := Rest-IntToFFP(TRUNC(Rest))  ;
  601.                               Rest3 := 0.5*Pb^.B.DeltaX*Rest2 ;
  602.                               Pb^.B.XLinks := Pb^.B.XLinks - Rest3 ;
  603.  
  604.                               V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
  605.  
  606.                   298,308  :                         (* F8,8 Zoom out Y *)
  607.                               Pb^.B.DeltaY := Pb^.B.DeltaY * 2.0 ;
  608.                               Pb^.B.YHinten := Pb^.B.YHinten-0.75*Pb^.B.DeltaY ;
  609.                               Rest := 2.0*Pb^.B.YHinten/Pb^.B.DeltaY ;
  610.                               Rest2 := Rest-IntToFFP(TRUNC(Rest))  ;
  611.                               Rest3 := 0.5*Pb^.B.DeltaY*Rest2 ;
  612.                               Pb^.B.YHinten := Pb^.B.YHinten - Rest3 ;
  613.  
  614.                               V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
  615.  
  616.                   299,309  :                         (* F9,9 Zoom out Z *)
  617.                               Pb^.B.DeltaZ := Pb^.B.DeltaZ * 2.0 ;
  618.                               Pb^.B.ZOben := Pb^.B.ZOben+Pb^.B.DeltaZ ;
  619.                               Rest := 2.0*Pb^.B.ZOben/Pb^.B.DeltaZ ;
  620.                               Rest2 := Rest-IntToFFP(TRUNC(Rest))  ;
  621.                               Rest3 := 0.5*Pb^.B.DeltaZ*Rest2 ;
  622.                               Pb^.B.ZOben := Pb^.B.ZOben - Rest3 ;
  623.  
  624.                               V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
  625.  
  626.                   300,310  :                         (* F10,10  Reset *)
  627.                               Pb^.B.XLinks := 0.0;
  628.                               Pb^.B.DeltaX := 1.0 ;
  629.                               Pb^.B.YHinten := 0.0 ;
  630.                               Pb^.B.DeltaY := 1.0 ;
  631.                               Pb^.B.ZOben := 2.0 ;
  632.                               Pb^.B.DeltaZ := 1.0 ;
  633.                               V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
  634.  
  635.                ELSE
  636.                END (* CASE *);
  637.             END (* IF NOT Taste *) ;
  638.          END (* IF rawKey *);
  639.       ELSE
  640.          IF (rawKey IN class) THEN
  641.             Taste := WelcheTaste(code);
  642.             IF (Taste = 280) OR (Taste = 278) THEN
  643.                 V^.Ende := TRUE ;
  644.             END ;
  645.          END (* IF rawKey *) ;
  646.       END (* IF kleine Bitmap  *) ;
  647.  
  648.  
  649.       IF (menuPick IN class) THEN
  650.          CASE MenuNummer(code) OF
  651.             0:                                       (* Projekt *)
  652.               CASE ItemNummer(code) OF
  653.  
  654.                  0:                                  (* Neue Funktion *)
  655.                     IF FunktionHolen(Pb,FALSE,TRUE) THEN
  656.                        V^.Ausstieg     := TRUE;
  657.                        V^.NeuBerechnen := TRUE ;
  658.                        Pb^.BildName := Pb^.FunktionName ;
  659.                        Pb^.GrosseBitmap   := FALSE ;
  660.                        Pb^.B.XLinks := 0.0;
  661.                        Pb^.B.DeltaX := 1.0 ;
  662.                        Pb^.B.YHinten := 0.0 ;
  663.                        Pb^.B.DeltaY := 1.0 ;
  664.                        Pb^.B.ZOben := 2.0 ;
  665.                        Pb^.B.DeltaZ := 1.0 ;
  666.                        Pb^.Schritt  := 6 ;
  667.                        UpdateMenus(Pb,2) ;
  668.                        UpdateMenus(Pb,3) ;
  669.                        UpdatePb(Pb) ;
  670.                        IF Pb^.GrosserSpeicher THEN
  671.                           ScrollLayer(Pb^.Layer,-Pb^.Layer^.scrollX,
  672.                                                 -Pb^.Layer^.scrollY) ;
  673.                        END (* IF *) ;
  674.                     END (*IF*);  |
  675.  
  676.                  1: IF FunktionHolen(Pb,FALSE,FALSE) THEN (* Funktion ändern *)
  677.                        V^.Ausstieg      := TRUE ;
  678.                        V^.NeuBerechnen  := TRUE ;
  679.                     END (*IF*) ; |
  680.  
  681.                  2: IF Laden(Pb,TRUE) THEN                (* Funktion laden *)
  682.  
  683.                        IF FunktionHolen(Pb,TRUE,FALSE) THEN
  684.                            Pb^.GrosseBitmap   := FALSE ;
  685.                            UpdateMenus(Pb,2) ;
  686.                            UpdateMenus(Pb,3) ;
  687.                            UpdatePb(Pb) ;
  688.                            IF Pb^.GrosserSpeicher THEN
  689.                               ScrollLayer(Pb^.Layer,-Pb^.Layer^.scrollX,
  690.                                                     -Pb^.Layer^.scrollY) ;
  691.                            END (* IF *) ;
  692.                            V^.Ausstieg     := TRUE;
  693.                            V^.NeuBerechnen := TRUE ;
  694.                            Pb^.BildName := Pb^.FunktionName ;
  695.                         ELSE
  696.                            Pb^.Funktion := Pb^.LetzteFunktion ;
  697.                            V^.Ausstieg     := TRUE;
  698.                         END (* IF FunktionHolen*) ;
  699.  
  700.                     END (* IF Laden *);  |
  701.  
  702.                  3: V^.OK := Speichern(Pb) |               (* Funktion speichern *)
  703.  
  704.                  4: BildSpeichern(Pb) ; |                  (* Bild speichern *)
  705.  
  706.                  5: V^.error := BildLaden(Pb);             (* Bild laden *)
  707.                     CASE V^.error OF
  708.                         -1:           |  (* cancel *)
  709.                         0 :           |  (* alles OK *)
  710.                         1 :    Request("Kein Speicher fuer BitmapPtr","Mist",NIL)|
  711.                         16:    Request("File not found","Mist",NIL) |
  712.                         17:    Request("Read error","Mist",NIL) |
  713.                         18:    Request("Zu wenig Pufferspeicher","Mist",NIL) |
  714.                         19:    Request("Kein IFF File","Mist",NIL) |
  715.                         24:    Request("Kein ILBM File","Mist",NIL) |
  716.                         25:    Request("BitMapHeader fehlt","Mist",NIL) |
  717.                         26:    Request("BODY Chunk fehlt","Mist",NIL) |
  718.                         27:    Request("Bild hat zu viele Bitplanes","Mist",NIL) |
  719.                         28:    Request("Unbekannter Kompressions Typ","Sowas",NIL)|
  720.  
  721.                     ELSE
  722.                     END (* CASE *) |
  723.  
  724.                  6: V^.Ende := TRUE; |
  725.               END (* CASE *) ; |
  726.  
  727.             1:                                         (* Auflösung *)
  728.               CASE ItemNummer(code) OF
  729. (* lächerlich *) 0: Pb^.Schritt := 6; V^.Ausstieg := TRUE ;
  730.                     UpdateMenus(Pb,2) |
  731.  
  732. (* gering *)     1: Pb^.Schritt := 4; V^.Ausstieg := TRUE ;
  733.                     UpdateMenus(Pb,2) |
  734.  
  735. (* mittel *)     2: Pb^.Schritt := 3; V^.Ausstieg := TRUE ;
  736.                     UpdateMenus(Pb,2) |
  737.  
  738. (* hoch *)       3: Pb^.Schritt := 2; V^.Ausstieg := TRUE ;
  739.                     UpdateMenus(Pb,2) |
  740.  
  741. (* noch höher *) 4: Pb^.Schritt := 1; V^.Ausstieg := TRUE ;
  742.                     UpdateMenus(Pb,2) |
  743.  
  744.               END (* CASE *) ; |
  745.  
  746.             2:                                             (* Einstellungen *)
  747.               CASE ItemNummer(code) OF
  748.  
  749. (* Raster *)     0: IF Pb^.Raster THEN                 (* Raster ausschalten *)
  750.                        V^.Ausstieg := TRUE ;
  751.                        Pb^.Raster := FALSE ;
  752.                        UpdateMenus(Pb,3) ;
  753.                     ELSE                               (* Raster einschalten *)
  754.                        Pb^.Raster := TRUE ;
  755.                        Pb^.Kasten := TRUE ;
  756.                        UpdateMenus(Pb,3) ;
  757.                        IF Pb^.Flaeche THEN
  758.                           V^.Ausstieg := TRUE ;
  759.                        ELSE
  760.                           KastenZeichnen(Pb) ;
  761.                           RasterZeichnen(Pb);
  762.                           IF Pb^.fertig THEN
  763.                              RestRaster(Pb) ;
  764.                           END ;
  765.                        END ;
  766.                     END (* IF *) |
  767.  
  768. (* Kasten *)     1: IF Pb^.Kasten THEN                 (* Kasten ausschalten *)
  769.                        V^.Ausstieg := TRUE ;
  770.                        Pb^.Kasten := FALSE ;
  771.                        Pb^.Raster := FALSE ;
  772.                        Pb^.Beschriftung := FALSE ;
  773.                        UpdateMenus(Pb,3) ;
  774.                     ELSE
  775.                        Pb^.Kasten := TRUE ;            (* Kasten einschalten *)
  776.                        UpdateMenus(Pb,3) ;
  777.                        IF Pb^.Flaeche THEN
  778.                           V^.Ausstieg := TRUE ;
  779.                        ELSE
  780.                           KastenZeichnen(Pb) ;
  781.                        END ;
  782.                     END (* IF *)  |
  783.  
  784. (* Achsen *)     2: IF Pb^.Achsen THEN
  785.                        V^.Ausstieg := TRUE ;
  786.                        Pb^.Achsen := FALSE ;
  787.                        UpdateMenus(Pb,3) ;
  788.                     ELSE
  789.                        V^.Ausstieg := TRUE ;
  790.                        Pb^.Achsen := TRUE ;
  791.                        UpdateMenus(Pb,3) ;
  792.                        XAchseZeichnen(Pb) ; RestXAchseZeichnen(Pb) ;
  793.                        YAchseZeichnen(Pb) ; RestYAchseZeichnen(Pb) ;
  794.                        ZAchseZeichnen(Pb) ;
  795.                     END (* IF *)  |
  796.  
  797. (*Beschriftung*) 3: IF Pb^.Beschriftung THEN      (* Beschriftung aus *)
  798.                        V^.Ausstieg := TRUE ;
  799.                        Pb^.Beschriftung := FALSE ;
  800.                        UpdateMenus(Pb,3) ;
  801.                     ELSE
  802.                        Pb^.Beschriftung := TRUE ; (* Beschriftung ein *)
  803.                        Pb^.Kasten := TRUE ;
  804.                        UpdateMenus(Pb,3) ;
  805.                        BeschriftungZeichnen(Pb) ;
  806.                        IF Pb^.Flaeche THEN
  807.                           V^.Ausstieg := TRUE ;
  808.                        ELSE
  809.                           KastenZeichnen(Pb) ;
  810.                        END ;
  811.                     END (* IF *) ; |
  812.  
  813. (* Flaeche *)    4: V^.Ausstieg := TRUE ;
  814.                     IF Pb^.Flaeche THEN
  815.                        Pb^.Flaeche := FALSE ;
  816.                     ELSE
  817.                        Pb^.Flaeche := TRUE ;
  818.                     END ;
  819.                     UpdateMenus(Pb,3) ; |
  820.  
  821. (* f(x,y) *)      5: IF Pb^.FSchreiben THEN         (* f(x,y) löschen *)
  822.                         Pb^.FSchreiben := FALSE ;
  823.                         FunktionReinSchreiben(Pb,TRUE) ;
  824.                      ELSE
  825.                         Pb^.FSchreiben := TRUE ;
  826.                         FunktionReinSchreiben(Pb,FALSE) ;
  827.                      END ;
  828.                      UpdateMenus(Pb,3) ;  |
  829.  
  830.  
  831. (*kleine Bmp*)   6: IF Pb^.GrosseBitmap THEN     (* Umschalten auf kleine *)
  832.                        V^.Ausstieg := TRUE ;
  833.                        Pb^.GrosseBitmap := FALSE ;
  834.                        Pb^.KastenX0 := 160 ;
  835.                        Pb^.KastenY0 := 46 ;
  836.                        UpdateMenus(Pb,3) ;
  837.                        UpdateMenus(Pb,2) ;
  838.                        IF Pb^.GrosserSpeicher THEN
  839.                           ScrollLayer(Pb^.Layer,-Pb^.Layer^.scrollX,
  840.                                                 -Pb^.Layer^.scrollY) ;
  841.                        END (* IF *) ;
  842.                     END ; |
  843.  
  844. (* gr Bmp *)     7: IF NOT Pb^.GrosseBitmap THEN   (* Umschalten auf grosse *)
  845.                        IF Pb^.Schritt = 4 THEN
  846.                           Pb^.Schritt := 3 ;
  847.                        END ;
  848.                        V^.Ausstieg := TRUE ;
  849.                        Pb^.GrosseBitmap := TRUE ;
  850.                        Pb^.KastenX0 := 450 ;
  851.                        Pb^.KastenY0 := 138 ;
  852.                        UpdateMenus(Pb,3) ;
  853.                        UpdateMenus(Pb,2) ;
  854.                     END ; |
  855.  
  856.               END (* CASE *) ;
  857.          ELSE
  858.  
  859.          END (* CASE *) ;
  860.  
  861.       END (* IF menuPick *) ;
  862.  
  863.       IntuiMsg := GetMsg(Pb^.Screen^.firstWindow^.userPort) ;
  864.    END (* WHILE *) ;
  865.  
  866.  
  867.    IF Pb^.GrosseBitmap THEN
  868.  
  869.       IF V^.IntuiBase^.activeScreen = Pb^.Screen THEN
  870.  
  871.          mousex := Pb^.Screen^.firstWindow^.mouseX ;
  872.          mousey := Pb^.Screen^.firstWindow^.mouseY ;
  873.  
  874.          IF (mousex # Pb^.oldX) OR (mousey # Pb^.oldY) THEN
  875.  
  876.             IF (mousex < Pb^.ScreenWidth-100) AND (mousex > 100) THEN
  877.                XScroll := FFPToInt(IntToFFP(mousex-100)*V^.PadFaktorX) ;
  878.                ELSE IF mousex <= 100 THEN
  879.                   XScroll:= 0 ;
  880.                ELSE
  881.                   XScroll := BitMapWidth - Pb^.ScreenWidth ;
  882.                END (* IF *) ;
  883.             END (* IF *) ;
  884.  
  885.             IF (mousey < Pb^.ScreenHeight-100) AND (mousey > 100) THEN
  886.                YScroll := FFPToInt(IntToFFP(mousey-100)*V^.PadFaktorY) ;
  887.                ELSE IF mousey <= 100 THEN
  888.                   YScroll := 0 ;
  889.                ELSE
  890.                   YScroll := BitMapHeight - Pb^.ScreenHeight ;
  891.                END (* IF *) ;
  892.             END (* IF *) ;
  893.  
  894.             ScrollLayer(Pb^.Layer,
  895.                         XScroll-Pb^.Layer^.scrollX,
  896.                         YScroll-Pb^.Layer^.scrollY) ;
  897.  
  898.             Pb^.oldX := mousex ;
  899.             Pb^.oldY := mousey ;
  900.  
  901.          END (* IF Screen=firstScreen *)
  902.       END (* IF *) ;
  903.    END (* IF *) ;
  904.  
  905. END CheckMessage ;
  906.  
  907.  
  908. PROCEDURE RFehler ;   (******************************************************)
  909.  
  910.   BEGIN
  911.    CASE V^.fN OF
  912.       3..105 : Pb^.Wert[x,y].YWert := Pb^.KastenY0+2*y |
  913.  
  914.    END (* CASE *) ;
  915.  
  916. END RFehler ;
  917.  
  918.  
  919.  
  920. PROCEDURE Zeichnen ;  (*************************************************)
  921.  
  922.   CONST MaxInt = 32767.0 ;
  923.  
  924.   VAR z0: INTEGER ;
  925.        XWert,YWert : FFP ;
  926.        P1x,P1y     : INTEGER ;
  927.  
  928.   BEGIN
  929.  
  930.   V^.Ausstieg := FALSE ; i := 0 ;
  931.   IF V^.NeuBerechnen THEN
  932.      V^.NeuBerechnen := FALSE ;
  933.      Pb^.fertig := FALSE ;
  934.   END ;
  935.  
  936.   IF NOT Pb^.GrosseBitmap THEN          (* kleine Bitmap *)
  937.      V^.FaktorX := 3.0*Pb^.B.DeltaX/72.0 ;
  938.      V^.FaktorY := 3.0*Pb^.B.DeltaY/72.0 ;
  939.      V^.FaktorZ := 60.0/Pb^.B.DeltaZ ;
  940.      z0 := FFPToInt(Pb^.B.ZOben/Pb^.B.DeltaZ *60.0) ;
  941.      Pb^.ymax    := 72 ;
  942.      V^.YWertmax:= 46 ;
  943.      V^.YWertmin:= 286 ;
  944.      Pb^.xmax    := 96 ;
  945.      P1x := -144 ;
  946.      P1y := 144 ;
  947.   ELSE                                  (* grosse Bitmap *)
  948.      V^.FaktorX := Pb^.B.DeltaX/72.0 ;
  949.      V^.FaktorY := Pb^.B.DeltaY/72.0 ;
  950.      V^.FaktorZ := 180.0/Pb^.B.DeltaZ ;
  951.      z0 := 3*FFPToInt(Pb^.B.ZOben/Pb^.B.DeltaZ *60.0) ;
  952.      Pb^.ymax    := 216 ;
  953.      V^.YWertmax:= 46*3 ;
  954.      V^.YWertmin:= 286*3 ;
  955.      Pb^.xmax    := 288 ;
  956.      P1x := -432 ;
  957.      P1y := 432 ;
  958.   END (* IF *) ;
  959.  
  960.   V^.MaxErgebnis := MaxInt/V^.FaktorZ ;
  961.  
  962.  IF NOT (V^.Ausstieg OR V^.Ende) THEN                      (* erste Spalte *)
  963.    y := 0;
  964.  
  965.    WHILE y <= Pb^.ymax DO
  966.  
  967.       V^.XNormiert:=Pb^.B.XLinks;
  968.       V^.YNormiert:=IntToFFP(y)*V^.FaktorY+Pb^.B.YHinten ;
  969.  
  970.       WITH Pb^.Wert[0,y] DO
  971.          XWert := Pb^.KastenX0-2*y ;
  972.          F := f(V^.XNormiert,V^.YNormiert) ;
  973.  
  974.          IF V^.fN =0 THEN
  975.             YWert := Pb^.KastenY0+2*y-FFPToInt(V^.FaktorZ*F)+z0 ;
  976.             IF YWert < V^.YWertmax+2*y THEN
  977.                YWert := V^.YWertmax+2*y
  978.             END ;
  979.             IF YWert > V^.YWertmin+2*y THEN
  980.                YWert := V^.YWertmin+2*y
  981.             END ;
  982.          ELSE
  983.             RFehler ;
  984.          END (* IF *) ;
  985.  
  986.          CheckMessage ;
  987.          IF (V^.Ausstieg OR V^.Ende) THEN
  988.             y := Pb^.ymax+10 ;
  989.          END (* IF *) ;
  990.  
  991.       END (* WITH *) ;
  992.  
  993.       y:=y+Pb^.Schritt ;
  994.  
  995.    END (* WHILE *) ;
  996.  END (* IF *) ;
  997.  
  998.  
  999.  IF NOT (V^.Ausstieg OR V^.Ende) THEN                    (* Erste Zeile *)
  1000.    x := 0 ; y := 0 ;
  1001.  
  1002.    WHILE x <= Pb^.xmax DO
  1003.  
  1004.       V^.XNormiert := IntToFFP(x)*V^.FaktorX+Pb^.B.XLinks;
  1005.       V^.YNormiert := Pb^.B.YHinten ;
  1006.  
  1007.       WITH Pb^.Wert[x,0] DO
  1008.          XWert := 4*x+Pb^.KastenX0 ;
  1009.          F := f(V^.XNormiert,V^.YNormiert) ;
  1010.  
  1011.  
  1012.          IF V^.fN = 0 THEN
  1013.             YWert := Pb^.KastenY0-FFPToInt(V^.FaktorZ*F)+z0 ;
  1014.  
  1015.             IF YWert < V^.YWertmax+2*y THEN
  1016.                YWert := V^.YWertmax+2*y
  1017.             END ;
  1018.             IF YWert > V^.YWertmin+2*y THEN
  1019.                YWert := V^.YWertmin+2*y
  1020.             END ;
  1021.  
  1022.          ELSE
  1023.             RFehler ;
  1024.          END (* IF *) ;
  1025.  
  1026.          IF x = 0 THEN
  1027.             Move(Pb^.Rp,Pb^.Wert[0,0].XWert,Pb^.Wert[0,0].YWert) ;
  1028.          ELSE
  1029.             Draw(Pb^.Rp,Pb^.Wert[x,0].XWert,Pb^.Wert[x,0].YWert) ;
  1030.          END (* IF *) ;
  1031.          i := i+1 ;
  1032.          IF i > 10 THEN
  1033.             CheckMessage ; i := 0 ;
  1034.          END (* IF *) ;
  1035.          IF (V^.Ausstieg OR V^.Ende) THEN
  1036.             x := Pb^.xmax+10 ;
  1037.          END (* IF *) ;
  1038.  
  1039.       END (* WITH *) ;
  1040.       x := x+Pb^.Schritt ;
  1041.  
  1042.    END (* WHILE *) ;
  1043.  END (* IF *) ;
  1044.  
  1045.  
  1046.  IF NOT (V^.Ausstieg OR V^.Ende) THEN                (* Rest *)
  1047.    y:=Pb^.Schritt ;
  1048.  
  1049.    WHILE y <= Pb^.ymax DO
  1050.  
  1051.       x:= Pb^.Schritt ;
  1052.  
  1053.       Move(Pb^.Rp,Pb^.Wert[x-Pb^.Schritt,y-Pb^.Schritt].XWert,
  1054.                   Pb^.Wert[x-Pb^.Schritt,y-Pb^.Schritt].YWert);
  1055.       Draw(Pb^.Rp,Pb^.Wert[x-Pb^.Schritt,y].XWert,Pb^.Wert[x-Pb^.Schritt,y].YWert) ;
  1056.  
  1057.       WHILE x <= Pb^.xmax DO
  1058.  
  1059.          V^.XNormiert:=IntToFFP(x)*V^.FaktorX+Pb^.B.XLinks;
  1060.          V^.YNormiert:=IntToFFP(y)*V^.FaktorY+Pb^.B.YHinten ;
  1061.  
  1062.          WITH Pb^.Wert[x,y] DO
  1063.             XWert := 4*x+Pb^.KastenX0-2*y ;
  1064.             F := f(V^.XNormiert,V^.YNormiert) ;
  1065.  
  1066.             IF V^.fN = 0 THEN
  1067.                YWert := Pb^.KastenY0+2*y-FFPToInt(V^.FaktorZ*F)+z0 ;
  1068.                IF YWert < V^.YWertmax+2*y THEN
  1069.                   YWert := V^.YWertmax+2*y
  1070.                END ;
  1071.                IF YWert > V^.YWertmin+2*y THEN
  1072.                   YWert := V^.YWertmin+2*y
  1073.                END ;
  1074.             ELSE
  1075.                RFehler ;
  1076.             END (* IF *) ;
  1077.          END (* WITH *) ;
  1078.  
  1079.  
  1080.          IF Pb^.Flaeche THEN
  1081.             SetBPen(Pb^.Rp,1) ;
  1082.             SetAPen(Pb^.Rp,0) ;
  1083.             V^.OK := AreaMove(Pb^.Rp,Pb^.Wert[x-Pb^.Schritt,y-Pb^.Schritt].XWert,
  1084.                                      Pb^.Wert[x-Pb^.Schritt,y-Pb^.Schritt].YWert) ;
  1085.             V^.OK := AreaDraw(Pb^.Rp,Pb^.Wert[x,y-Pb^.Schritt].XWert,
  1086.                                      Pb^.Wert[x,y-Pb^.Schritt].YWert) ;
  1087.             V^.OK := AreaDraw(Pb^.Rp,Pb^.Wert[x,y].XWert,
  1088.                                      Pb^.Wert[x,y].YWert) ;
  1089.             V^.OK := AreaDraw(Pb^.Rp,Pb^.Wert[x-Pb^.Schritt,y].XWert,
  1090.                                      Pb^.Wert[x-Pb^.Schritt,y].YWert) ;
  1091.             V^.OK := AreaEnd(Pb^.Rp) ;
  1092.             SetAPen(Pb^.Rp,1) ;
  1093.             Move(Pb^.Rp,Pb^.Wert[x-Pb^.Schritt,y].XWert,
  1094.                         Pb^.Wert[x-Pb^.Schritt,y].YWert) ;
  1095.             Draw(Pb^.Rp,Pb^.Wert[x-Pb^.Schritt,y-Pb^.Schritt].XWert,
  1096.                         Pb^.Wert[x-Pb^.Schritt,y-Pb^.Schritt].YWert) ;
  1097.             Draw(Pb^.Rp,Pb^.Wert[x,y-Pb^.Schritt].XWert,
  1098.                         Pb^.Wert[x,y-Pb^.Schritt].YWert) ;
  1099.          END (* IF *) ;
  1100.  
  1101.          Move(Pb^.Rp,Pb^.Wert[x-Pb^.Schritt,y].XWert,
  1102.                      Pb^.Wert[x-Pb^.Schritt,y].YWert) ;
  1103.          Draw(Pb^.Rp,Pb^.Wert[x,y].XWert,
  1104.                      Pb^.Wert[x,y].YWert) ;
  1105.          Draw(Pb^.Rp,Pb^.Wert[x,y-Pb^.Schritt].XWert,
  1106.                      Pb^.Wert[x,y-Pb^.Schritt].YWert) ;
  1107.  
  1108.          IF Pb^.Achsen THEN
  1109.             IF x = Pb^.A.XNull/4 THEN                         (* YAchse *)
  1110.  
  1111.                SetAPen(Pb^.Rp,0) ;                       (* Hintergrundfarbe *)
  1112.  
  1113.                Move(Pb^.Rp,Pb^.Wert[x,y-Pb^.Schritt].XWert-2,
  1114.                            Pb^.KastenY0+Pb^.A.ZNull+2*(y-Pb^.Schritt)+1) ;
  1115.                Draw(Pb^.Rp,Pb^.KastenX0+P1x+Pb^.A.XNull-2,
  1116.                            Pb^.KastenY0+P1y+Pb^.A.ZNull+1) ;
  1117.                Move(Pb^.Rp,Pb^.Wert[x,y-Pb^.Schritt].XWert-3,
  1118.                            Pb^.KastenY0+Pb^.A.ZNull+2*(y-Pb^.Schritt)+1) ;
  1119.                Draw(Pb^.Rp,Pb^.KastenX0+P1x+Pb^.A.XNull-3,
  1120.                            Pb^.KastenY0+P1y+Pb^.A.ZNull+1) ;
  1121.  
  1122.                Move(Pb^.Rp,Pb^.Wert[x,y-Pb^.Schritt].XWert-2,
  1123.                            Pb^.KastenY0+Pb^.A.ZNull+2*(y-Pb^.Schritt)+3) ;
  1124.                Draw(Pb^.Rp,Pb^.KastenX0+P1x+Pb^.A.XNull-2,
  1125.                            Pb^.KastenY0+P1y+Pb^.A.ZNull+3) ;
  1126.                Move(Pb^.Rp,Pb^.Wert[x,y-Pb^.Schritt].XWert-1,
  1127.                            Pb^.KastenY0+Pb^.A.ZNull+2*(y-Pb^.Schritt)+3) ;
  1128.                Draw(Pb^.Rp,Pb^.KastenX0+P1x+Pb^.A.XNull-1,
  1129.                            Pb^.KastenY0+P1y+Pb^.A.ZNull+3) ;
  1130.  
  1131.  
  1132.                SetAPen(Pb^.Rp,1) ;                       (* Vordergrundfarbe *)
  1133.  
  1134.                Move(Pb^.Rp,Pb^.Wert[x,y-Pb^.Schritt].XWert,
  1135.                            Pb^.KastenY0+Pb^.A.ZNull+2*(y-Pb^.Schritt)) ;
  1136.                Draw(Pb^.Rp,Pb^.KastenX0+P1x+Pb^.A.XNull,
  1137.                            Pb^.KastenY0+P1y+Pb^.A.ZNull) ;
  1138.  
  1139.                RestYAchseZeichnen(Pb) ;
  1140.             END ;
  1141.  
  1142.          END ;
  1143.  
  1144.          x := x+Pb^.Schritt ;
  1145.          i := i+1 ;
  1146.          IF i > 5 THEN
  1147.             CheckMessage ; i := 0 ;
  1148.          END (* IF *) ;
  1149.          IF (V^.Ende OR V^.Ausstieg) THEN
  1150.            x := Pb^.xmax+10;
  1151.          END (* IF *) ;
  1152.  
  1153.       END (* WHILE *) ;
  1154.  
  1155.       IF Pb^.Achsen THEN
  1156.          IF 2*y < Pb^.A.YNull+2*Pb^.Schritt THEN      (* X,Z-Achse *)
  1157.             XAchseZeichnen(Pb) ; ZAchseZeichnen(Pb) ;
  1158.             RestXAchseZeichnen(Pb) ; RestYAchseZeichnen(Pb) ;
  1159.          END ;
  1160.       END ;
  1161.  
  1162.       y := y+Pb^.Schritt ;
  1163.       IF (V^.Ende OR V^.Ausstieg) THEN
  1164.          y := Pb^.ymax+10;
  1165.       END (* IF *) ;
  1166.  
  1167.    END (* WHILE *) ;
  1168.  END (* IF *) ;
  1169.  
  1170.  Pb^.fertig := TRUE ;
  1171.  
  1172.  
  1173. END Zeichnen ;
  1174.  
  1175.  
  1176.  
  1177.  
  1178.  
  1179. BEGIN  (* Haupt *)        (***************************************************)
  1180.  
  1181.    Pb := AllocMem(SIZE(PlotBase),MemReqSet{public,memClear}) ;
  1182.    IF Pb = NIL THEN
  1183.       Request('Kein Speicher für PlotBase',"Zu dumm",NIL) ;
  1184.       Arts.Terminate ;
  1185.    END ;
  1186.  
  1187.    V := AllocMem(SIZE(Variablen),MemReqSet{public,memClear}) ;
  1188.    IF V = NIL THEN
  1189.       Request('Kein Speicher für Variablen',"Booa ey",NIL) ;
  1190.       Arts.Terminate ;
  1191.    END ;
  1192.  
  1193.    IF (Arts.wbStarted) THEN
  1194.       V^.msg:=Arts.startupMsg;
  1195.       V^.lock:=V^.msg^.argList^[0].lock;
  1196.       IF (V^.lock # NIL) THEN
  1197.           GetPathFromLock(Pb^.Dir,V^.lock);
  1198.       END; (* IF *)
  1199.    ELSE
  1200.       GetPathFromLock(Pb^.Dir,Arts.oldCurrentDir);
  1201.       IF Length(Pb^.Dir) = 0 THEN
  1202.          Pb^.Dir := "SYS:" ;
  1203.       END ;
  1204.    END; (* IF *)
  1205.  
  1206.    Copy(Pb^.DirBilder,Pb^.Dir) ;
  1207.  
  1208.    IF NumArgs() >0 THEN
  1209.       GetArg(1,Pb^.Funktion,V^.len) ;
  1210.       IF Compare(Pb^.Funktion,"?")=0 THEN    (* Fragezeichen übergeben *)
  1211.          InOut.WriteString('Plot V1.0 vom 16.10.92\n') ;
  1212.          InOut.WriteString('Stefan Köhle\n') ;
  1213.          InOut.WriteString('Erhardtstr. 10\n7033 Herrenberg\n') ;
  1214.          Arts.Terminate ;
  1215.       END ;
  1216.       V^.Argument := TRUE ;                 (* Argument vorhanden *)
  1217.  
  1218.    END ;
  1219.  
  1220.  
  1221.    V^.IntuiBase := ADR(IntuitionL) ;
  1222.  
  1223.    Pb^.Flaeche := TRUE ; Pb^.Raster := TRUE ; Pb^.FSchreiben := TRUE ;
  1224.    Pb^.GrosserSpeicher := TRUE ; Pb^.Kasten := TRUE ; Pb^.Achsen := TRUE ;
  1225.    Pb^.GrosseBitmap := FALSE ;Pb^.Beschriftung := TRUE ;
  1226.    Pb^.oldX := 0; Pb^.oldY := 0 ;
  1227.  
  1228.    Pb^.FaktorX:=0.1; Pb^.FaktorY:=0.1; Pb^.FaktorZ:= 50.0 ;
  1229.    Pb^.Schritt := 6;
  1230.    Pb^.B.XLinks := 0.0 ;
  1231.    Pb^.B.DeltaX := 1.0 ;
  1232.    Pb^.B.YHinten := 0.0 ;
  1233.    Pb^.B.DeltaY := 1.0 ;
  1234.    Pb^.B.ZOben := 2.0 ;
  1235.    Pb^.B.DeltaZ := 1.0 ;
  1236.    Pb^.KastenX0 := 160 ;
  1237.    Pb^.KastenY0 := 46 ;
  1238.    Pb^.LetzteFunktion := '0' ;
  1239.    Pb^.fertig := FALSE ;
  1240.  
  1241.    StartUp ;
  1242.  
  1243.    Pb^.Rp := Pb^.Screen^.firstWindow^.rPort ;
  1244.  
  1245. (*  Berechnungen für Scrollerei *)
  1246.  
  1247.    V^.PadHeight:= Pb^.ScreenHeight-200 ;
  1248.    V^.PadWidth:= Pb^.ScreenWidth-200 ;
  1249.    V^.PadFaktorX := IntToFFP(BitMapWidth-Pb^.ScreenWidth)/IntToFFP(V^.PadWidth);
  1250.    V^.PadFaktorY := IntToFFP(BitMapHeight-Pb^.ScreenHeight)/IntToFFP(V^.PadHeight) ;
  1251.  
  1252.  
  1253.    V^.Ende := FALSE ;
  1254.    V^.Ausstieg := TRUE ;
  1255.    V^.NeuBerechnen := TRUE ;
  1256.    ClearBitMap(Pb) ;
  1257.    ScreenHoch(Pb^.Screen) ;
  1258.    Pb^.BildName := 'Bild' ;
  1259.  
  1260.  
  1261.    IF NOT ArgTesten(Pb,V^.Argument) THEN
  1262.  
  1263.       IF V^.Argument THEN    (* cancel beim StringRequester *)
  1264.  
  1265.          IF NOT Laden(Pb,TRUE) THEN                  (* war nix mit Laden *)
  1266.             Pb^.Funktion := "0" ;                    (* Defaultfunktion *)
  1267.             Pb^.FunktionName := '';
  1268.             V^.OK := FunktionHolen(Pb,TRUE,FALSE) ;
  1269.          END ;
  1270.       ELSE                 (* kein Argument übergeben *)
  1271.  
  1272.  
  1273.          IF NOT FunktionHolen(Pb,FALSE,TRUE) THEN
  1274.             IF NOT Laden(Pb,TRUE) THEN                    (* war nix mit Laden *)
  1275.                Pb^.Funktion := "0" ;                    (* Defaultfunktion *)
  1276.                Pb^.FunktionName := '' ;
  1277.                V^.OK := FunktionHolen(Pb,TRUE,FALSE) ;
  1278.             END ;
  1279.  
  1280.          END ;
  1281.       END (* IF *) ;
  1282.    END ;
  1283.  
  1284.    UpdateMenus(Pb,2) ;
  1285.    UpdateMenus(Pb,3) ;
  1286.    UpdatePb(Pb) ;
  1287.    V^.NeuBerechnen := TRUE ;
  1288.    V^.Ausstieg := TRUE ;
  1289.  
  1290.  
  1291.    LOOP
  1292.       IF V^.Ausstieg THEN
  1293.          ClearBitMap(Pb) ;
  1294.          IF Pb^.Kasten THEN  KastenZeichnen(Pb) ;  END  ;
  1295.          IF Pb^.Achsen THEN
  1296.             XAchseZeichnen(Pb) ; YAchseZeichnen(Pb) ; ZAchseZeichnen(Pb) ;
  1297.             RestXAchseZeichnen(Pb); RestYAchseZeichnen(Pb) ;
  1298.          END  ;
  1299.          IF Pb^.Raster THEN  RasterZeichnen(Pb) ;  END  ;
  1300.          IF Pb^.Beschriftung THEN  BeschriftungZeichnen(Pb) ; END  ;
  1301.          IF Pb^.FSchreiben THEN FunktionReinSchreiben(Pb,FALSE) ; END ;
  1302.  
  1303.          Zeichnen ;
  1304.  
  1305.          IF (NOT V^.Ausstieg) AND (NOT V^.Ende)  THEN
  1306.             IF Pb^.Raster THEN RestRaster(Pb) ; END (* IF *) ;
  1307.             IF Pb^.Achsen THEN
  1308.  
  1309.                RestXAchseZeichnen(Pb) ; RestYAchseZeichnen(Pb) ;
  1310.             END (* IF *) ;
  1311.          END ;
  1312.       END (* IF *) ;
  1313.  
  1314.       IF (NOT V^.Ausstieg) AND (NOT V^.Ende)  THEN
  1315.          DosL.Delay(2) ;
  1316.          CheckMessage ;
  1317.       END ;
  1318.  
  1319.       IF V^.Ende THEN
  1320.          EXIT ;
  1321.       END ;
  1322.    END (* LOOP *) ;
  1323.  
  1324.  
  1325.   CLOSE
  1326.  
  1327.    IF Pb # NIL THEN
  1328.       IF Pb^.Screen # NIL THEN
  1329.          ScreenWeg(Pb^.Screen) ;
  1330.       END ;
  1331.       CleanUp(Pb) ;
  1332.    END ;
  1333.    IF Pb # NIL THEN  FreeMem(Pb,SIZE(PlotBase)) ;  Pb := NIL ;  END ;
  1334.    IF V  # NIL THEN  FreeMem(V,SIZE(Variablen)) ;  V  := NIL ;  END ;
  1335.  
  1336. END Plot.MOD
  1337.  
  1338.  
  1339.  
  1340.  
  1341.  
  1342.  
  1343.  
  1344.  
  1345.  
  1346.  
  1347.  
  1348.  
  1349.  
  1350.  
  1351.  
  1352.  
  1353.  
  1354.  
  1355.